package com.booksystem.campuslibrarymanagementsystem.controller.admin;

import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.InventoryManagement.Inventoryadd;
import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.InventoryManagement.Inventorylist;
import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.InventoryManagement.Lowinventorylist;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Result;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Verifys;
import com.booksystem.campuslibrarymanagementsystem.commen.result.adminresult.InventoryManagementR.InventorylistR;
import com.booksystem.campuslibrarymanagementsystem.entity.AccountTable;
import com.booksystem.campuslibrarymanagementsystem.entity.BooksTable;
import com.booksystem.campuslibrarymanagementsystem.service.AccountTableService;
import com.booksystem.campuslibrarymanagementsystem.service.BooksTableService;
import com.booksystem.campuslibrarymanagementsystem.utils.AuditUtil;
import com.booksystem.campuslibrarymanagementsystem.utils.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/Admin")
@Api(tags = "库存管理")
public class InventoryManagementController {
    private final String idt = "admin";
    Verifys verifys = new Verifys();
    BooksTable booksTable = new BooksTable();
    @Autowired
    private AccountTableService accountTableService;
    @Autowired
    private BooksTableService booksTableService;

    /**
     * 1.总库存。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Inventorylist（token）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：查询到所有数据保存到List<BooksTable> list中，判断list是否为空
     * 6.为空：返回失败信息-暂时没有数据。不为空：筛除数据并保存到list1中
     * 7.发送list1到前端
     */
    @PostMapping("/inventoryList")
    @ApiOperation(value = "总库存", notes = "所有图书库存")
    public Result<List<InventorylistR>> inventoryList(@RequestBody Inventorylist inventorylist) {
        verifys = AuditUtil.verifyUtil(inventorylist.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                List<BooksTable> list = booksTableService.list();
                if (!list.isEmpty()) {
                    ArrayList<InventorylistR> list1 = new ArrayList<>();
                    for (int i = 0; i < list.size(); i++) {
                        booksTable = list.get(i);
                        InventorylistR inventorylistR = new InventorylistR();
                        inventorylistR.setBookid(booksTable.getBookid());
                        inventorylistR.setTitle(booksTable.getTitle());
                        inventorylistR.setAuthor(booksTable.getAuthor());
                        inventorylistR.setTotalcopies(booksTable.getTotalcopies());
                        inventorylistR.setAvailablecopies(booksTable.getAvailablecopies());
                        inventorylistR.setCreatedat(booksTable.getCreatedat());
                        int a = booksTable.getTotalcopies() - booksTable.getAvailablecopies();
                        inventorylistR.setRemainders(a);
                        list1.add(inventorylistR);
                    }
                    System.out.println("库存列表发送成功");
                    return Result.success(list1, list1.size());
                } else {
                    return Result.fail("暂时没有数据");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 2.低库存。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Lowinventorylist（token，categoryname）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：查询到所有数据保存到List<BooksTable> list中，判断list是否为空
     * 6.为空：返回失败信息-暂时没有数据。不为空：筛除数据保留库存少于30%的书并保存到list1中
     * 7.发送list1到前端
     */
    @PostMapping("/lowInventoryList")
    @ApiOperation(value = "低库存", notes = "所有库存低的图书")
    public Result<List<InventorylistR>> lowInventoryList(@RequestBody Lowinventorylist lowinventorylist) {
        verifys = AuditUtil.verifyUtil(lowinventorylist.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                List<BooksTable> list = booksTableService.list();
                if (!list.isEmpty()) {
                    ArrayList<InventorylistR> list1 = new ArrayList<>();
                    for (int i = 0; i < list.size(); i++) {
                        booksTable = list.get(i);
                        InventorylistR inventorylistR = new InventorylistR();
                        inventorylistR.setBookid(booksTable.getBookid());
                        inventorylistR.setTitle(booksTable.getTitle());
                        inventorylistR.setAuthor(booksTable.getAuthor());
                        inventorylistR.setTotalcopies(booksTable.getTotalcopies());
                        inventorylistR.setAvailablecopies(booksTable.getAvailablecopies());
                        inventorylistR.setCreatedat(booksTable.getCreatedat());
                        int a = booksTable.getTotalcopies() - booksTable.getAvailablecopies();
                        inventorylistR.setRemainders(a);
                        if (a < booksTable.getTotalcopies() * 0.3) {
                            list1.add(inventorylistR);
                        }
                    }
                    System.out.println("低库存列表发送成功");
                    return Result.success(list1, list1.size());
                } else {
                    return Result.fail("暂时没有数据");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 3.库存添加。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Inventoryadd（token，bookid，quantity，）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：检查增加的数量是否大于0：
     * if (inventoryadd.getQuantity() > 0) {
     * 检查增加的数量是否大于0，如果是，则继续执行库存增加的操作。
     * 通过ID查询现有的图书信息：
     * booksTable = booksTableService.queryById(inventoryadd.getBookid());
     * 通过提供的图书ID查询数据库中是否存在该图书。
     * 检查图书是否存在：
     * 如果查询结果不为空（即找到了该图书）：
     * 进行下一步操作。
     * 如果查询结果为空（即没有找到该图书）：
     * 返回错误信息，“没有找到id为inventoryadd.getBookid()的书籍”。
     * 计算新的库存总量：
     * int quantity = booksTable.getTotalcopies() + inventoryadd.getQuantity();
     * 计算新的库存总量，即将原有的库存数量加上要增加的数量。
     * 更新图书库存：
     * boolean a = booksTableService.AddBook(inventoryadd.getBookid(), quantity);
     * 使用图书ID和新的库存总量来更新图书库存。
     * 如果更新成功（a为true），则返回成功信息，“添加成功”。
     * 如果更新失败（a为false），则返回错误信息，“添加失败”。
     * 返回结果：
     * 如果一切正常，返回处理结果信息（成功或失败）。
     * 处理数量小于等于0的情况：
     * else {
     * 如果增加的数量不大于0，则直接返回错误信息，“数量不能低于1”。
     */
    @PostMapping("/inventoryAdd")
    @ApiOperation(value = "库存添加", notes = "图书库存添加")
    public Result inventoryAdd(@RequestBody Inventoryadd inventoryadd) {
        verifys = AuditUtil.verifyUtil(inventoryadd.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                if (inventoryadd.getQuantity() > 0) {
                    booksTable = booksTableService.queryById(inventoryadd.getBookid());
                    if (booksTable != null) {
                        int quantity = booksTable.getTotalcopies() + inventoryadd.getQuantity();
                        boolean a = booksTableService.AddBook(inventoryadd.getBookid(), quantity);
                        if (a) {
                            System.out.println(booksTable.getTitle()  + "库存添加成功");
                            return Result.success("添加成功", 1);
                        } else {
                            return Result.fail("添加失败");
                        }
                    } else {
                        return Result.fail("没有找到id为" + inventoryadd.getBookid() + "的书籍");
                    }
                } else {
                    return Result.fail("数量不能低于1");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 4.库存删除。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Categoryadd（token，quantity，bookid）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：检查减少的数量是否大于0：
     * if (inventoryadd.getQuantity() > 0) {
     * 检查减少的数量是否大于0，如果是，则继续执行库存减少的操作。
     * 通过ID查询现有的图书信息：
     * booksTable = booksTableService.queryById(inventoryadd.getBookid());
     * 通过提供的图书ID查询数据库中是否存在该图书。
     * 检查图书是否存在：
     * 如果查询结果不为空（即找到了该图书）：
     * 进行下一步操作。
     * 如果查询结果为空（即没有找到该图书）：
     * 返回错误信息，“没有找到id为inventoryadd.getBookid()的书籍”。
     * 检查库存数量是否足够：
     * if (booksTable.getTotalcopies() >= inventoryadd.getQuantity()) {
     * 检查库存数量是否大于或等于要减少的数量。
     * 如果库存数量足够，则继续执行减少操作。
     * 如果库存数量不足，则返回错误信息，“删除数量大于库存数量”。
     * 计算新的库存总量：
     * int quantity = booksTable.getTotalcopies() - inventoryadd.getQuantity();
     * 计算新的库存总量，即将原有的库存数量减去要减少的数量。
     * 检查新的库存总量是否大于等于可用数量：
     * if (quantity >= booksTable.getAvailablecopies()) {
     * 检查新的库存总量是否大于等于图书的可用数量。
     * 如果新的库存总量大于等于可用数量，则继续执行更新操作。
     * 如果新的库存总量小于可用数量，则返回错误信息，“剩余数量小于借出数量，不符合现实”。
     * 更新图书库存：
     * boolean a = booksTableService.AddBook(inventoryadd.getBookid(), quantity);
     * 使用图书ID和新的库存总量来更新图书库存。
     * 如果更新成功（a为true），则返回成功信息，“添加成功”。
     * 如果更新失败（a为false），则返回错误信息，“添加失败”。
     * 返回结果：
     * 如果一切正常，返回处理结果信息（成功或失败）。
     * 处理数量小于等于0的情况：
     * else {
     * 如果减少的数量不大于0，则直接返回错误信息，“数量不能低于1”。
     */
    @PostMapping("/inventoryDelete")
    @ApiOperation(value = "库存删除", notes = "图书库存删除")
    public Result inventoryDelete(@RequestBody Inventoryadd inventoryadd) {
        verifys = AuditUtil.verifyUtil(inventoryadd.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                if (inventoryadd.getQuantity() > 0) {
                    booksTable = booksTableService.queryById(inventoryadd.getBookid());
                    if (booksTable != null) {
                        if (booksTable.getTotalcopies() >= inventoryadd.getQuantity()) {
                            int quantity = booksTable.getTotalcopies() - inventoryadd.getQuantity();
                            if (quantity >= booksTable.getAvailablecopies()) {
                                boolean a = booksTableService.AddBook(inventoryadd.getBookid(), quantity);
                                if (a) {
                                    System.out.println(booksTable.getTitle()  + "库存删除成功");
                                    return Result.success("删除成功", 1);
                                } else {
                                    return Result.fail("删除失败");
                                }
                            } else {
                                return Result.fail("剩余数量小于借出数量，不符合现实");
                            }
                        } else {
                            return Result.fail("删除数量大于库存数量");
                        }
                    } else {
                        return Result.fail("没有找到id为" + inventoryadd.getBookid() + "的书籍");
                    }
                } else {
                    return Result.fail("数量不能低于1");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }
}


